/**
 * 通用js方法封装处理
 * Copyright (c) 2018 jallyzhang 
 */
(function ($) {
    $.extend({
		table: {
			_option: {},
			isTree:function(){
				return $.table._option.isTree ? true : false;
			},
			init: function(options) { // options 为用户传递过来的配置
				// 不能将用户传递过来的事件替换掉了表格中需要的事件，所以做以下操作
				_userFunction = {};
				_initFunctions = ["onOpen","onCheck","onUncheck","onCheckAll","onUncheckAll","onDblClickRow","onLoadSuccess","loadFilter"];
				$.each(_initFunctions,function(i,v){
					if($.common.isFunction(options[v])){ // 如果用户传入了该事件
						_userFunction[v] = options[v]; 
						delete options[v];
					}
				});
				// 定义默认事件
				_loadFilter = function(data){
					if(data && data.state == web_status.SUCCESS){
						if($.common.isFunction(_userFunction.loadFilter)){
							_userFunction.loadFilter(index,row);
						}
						return data;
					}else{
						$.alert.error(data.msg || "操作失败！");
						return [];
					}
				},
				_onOpen = function(){
					var btns = $('<div data-toggle="buttons" class="btn-group btn-overlap btn-corner pull-right"></div>');
					if(_default_options.showSearch){
						$('<a class="btn btn-white btn-xs" data-toggle="button" title="隐藏/显示收缩">' +
							'<i class="fa fa-search bigger-110 icon-only"></i></a>').on("click",function(){
								$(".search-collapse").slideToggle();
						}).appendTo(btns); 
					}
					if(_default_options.showRefresh){
						$('<a class="btn btn-white btn-xs" title="刷新数据">' +
							'<i class="fa fa-refresh bigger-110 icon-only"></i></a>').on("click",function(){
								$.table.refresh();
						}).appendTo(btns);
					}
					if(_default_options.showColumn){
						$('<a class="btn btn-white btn-xs" title="隐藏/显示列">' +
							'<i class="fa fa-table bigger-110 icon-only"></i></a>').on("click",function(e){
								$.table.showColumn(e);
						}).appendTo(btns);
					}
					btns.appendTo(_default_options.toolbar);
					if($.common.isFunction(_userFunction.onOpen)){ // 如果用户设置了onOpen方法
						_userFunction.onOpen();
					}
				},
				_onLoadSuccess = function(data){
					// 如果页面出现滚动条的话，重新设置表格大小，否则表格页面会出现一点点bug
					if(document.body.scrollHeight > (window.innerHeight || document.documentElement.clientHeight)){
						$.table.grid.datagrid("resize",{
							width:'100%'
						})
					}
					if($.common.isFunction(_userFunction.onLoadSuccess)){ // 如果用户设置了onLoadSuccess方法
						_userFunction.onLoadSuccess(data);
					}
				},
				_onTableCheckChange = function(){
					var checked = $.table.getCheckedValues();
					$('#toolbar .btn-multiple').toggleClass('disabled', !checked.length);
					$('#toolbar .btn-single').toggleClass('disabled', checked.length!=1);
				},
				_onCheck = function(index,row){
					_onTableCheckChange();
					if($.common.isFunction(_userFunction.onCheck)){
						_userFunction.onCheck(index,row);
					}
				},
				_onUncheck = function(index,row){
					_onTableCheckChange();
					if($.common.isFunction(_userFunction.onUncheck)){
						_userFunction.onUncheck(index,row);
					}
				},
				_onCheckAll = function(){
					_onTableCheckChange();
					if($.common.isFunction(_userFunction.onCheckAll)){
						_userFunction.onCheckAll(rows);
					}
				},
				_onUncheckAll = function(rows){
					_onTableCheckChange();
					if($.common.isFunction(_userFunction.onUncheckAll)){
						_userFunction.onUncheckAll(rows);
					}
				},
				_onDblClickRow = function(index,row){
					if($.common.isFunction(_userFunction.onDblClickRow)){
						// 选择选中行，其他的行取消选择
						$.table.grid.datagrid("uncheckAll").datagrid("checkRow",index);
						_userFunction.onDblClickRow(index,row);
					}
				};
				// 默认的表格配置
				_default_options = {
					tableId:"ey_grid",
					idField:"id",
					formId:"ff",
					showSearch:true,
					showRefresh:true,
					showColumn:true,
					modalTarget:top,
					toolbar:'#toolbar',
					pageList:[20,40,80,120],
					pageSize:20,
					minHeight:400,
					fitColumns:true,
					loadFilter:_loadFilter,
					onOpen:_onOpen,
					onCheck:_onCheck,
					onUncheck:_onUncheck,
					onCheckAll:_onCheckAll,
					onUncheckAll:_onUncheckAll,
					onDblClickRow:_onDblClickRow,
					onLoadSuccess:_onLoadSuccess
				};
				$.extend(_default_options,options); // 将用户配置替换为默认配置
				$.table._option = _default_options;
				
				$.table.grid = $("#" + _default_options.tableId);
				
				if(!$.table.isTree()){
					$.extend(_default_options,{
						checkOnSelect:false,
						striped:true,
						pagination:true
					});
					$.table.grid.datagrid(_default_options);
				}else{
					$.extend(_default_options,{
						checkbox: false
					});
					$.table.grid.treegrid(_default_options);
				}
			},
			showColumn:function(event){
				var state = $.table.grid.data('datagrid');
				if (!state.columnMenu){ 
					state.columnMenu = $('<div></div>').appendTo('body');
					state.columnMenu.menu({
	                    onClick: function(item){
	                        if (item.iconCls == 'tree-checkbox1'){
	                            $.table.grid.datagrid('hideColumn', item.name);
	                            $(this).menu('setIcon', {
	                                target: item.target,
	                                iconCls: 'tree-checkbox0'
	                            });
	                        } else {
	                            $.table.grid.datagrid('showColumn', item.name);
	                            $(this).menu('setIcon', {
	                                target: item.target,
	                                iconCls: 'tree-checkbox1'
	                            });
	                        }
	                    }
	                });
	                var fields = $.table.grid.datagrid('getColumnFields',true).concat($.table.grid.datagrid('getColumnFields',false));
	                for(var i=0; i<fields.length; i++){
	                    var field = fields[i];
	                    var col = $.table.grid.datagrid('getColumnOption', field);
	                    if(col.checkbox) continue;
	                    state.columnMenu.menu('appendItem', {
	                        text: col.title,
	                        name: field,
	                        iconCls: col.hidden ? 'tree-checkbox0' : 'tree-checkbox1'
	                    });
	                }
                }
                state.columnMenu.menu('show', {
                    left:event.pageX,
                    top:event.pageY
                });
			},
			// 刷新表格，可以使用新的链接，不填url表示使用之前的链接，此刷新将从第一页开始
			refresh: function(url,params){
				if($.common.isNotEmpty(url)){
					if($.table.isTree()){
						$.table.grid.treegrid("options").url = url; // 使用之前的链接
					}else{
						$.table.grid.datagrid("options").url = url; // 使用之前的链接
					}
				}
				if($.table.isTree()){
					$.table.grid.treegrid("load",params);
				}else{
					$.table.grid.datagrid("load",params);
				}
			},
			// 获取选中行，某个列的值，返回集合，默认为id
			getCheckedValues:function(){
				var col = $.table._option.idField;
				var cks = $.table.grid.datagrid('getChecked');
				return $.map(cks, function (row) {
        	        return row[col];
        	    });
			},
			// 点击表格上面的查询按钮，提交查询表单
			search:function(formId){
				formId = formId || "sff";
				var json = $.form.serializeObject(formId) || {};
				$.table.refresh(null,json);
			},
			// 添加信息弹出框
            add: function() {
            	var opt = $.table._option;
                $.modal.open({
                	title:"添加" + opt.modalName, 
                	url:opt.addUrl,
                	target:opt.modalTarget,
                	buttonsAppend:opt.modalButtonsAppend,
                	buttons:opt.modalButtons,
                	onSubmit:opt.onModalSubmit || function(){
                		$.table.submit(opt.saveUrl);
                	}
                });
            },
            // 修改信息弹出框
            edit: function() {
            	var id = $.table.getCheckedValues()[0],opt = $.table._option;
            	if($.common.isEmpty(id)){
            		$.alert.warn("请选择一条记录！");
        			return;
            	}
            	$.modal.open({
            		title:"修改" + opt.modalName, 
            		url:opt.editUrl.replace("{id}", id),
            		target:opt.modalTarget,
            		buttonsAppend:opt.modalButtonsAppend,
            		buttons:opt.modalButtons,
            		onLoad:function(){
            			opt.modalTarget.$("#"+opt.formId).form().form("resetDirty");
            		},
            		onSubmit:opt.onModalSubmit || function(){
            			var fields = opt.modalTarget.$("#"+opt.formId).form('options').dirtyFields;
            			if(fields.length > 0){
            				$.table.submit(opt.updateUrl);
            			}else{
            				$.modal.close();
            			}
                	}
            	});
            },
            // table上面表格默认提交方式
            submit: function(url){
            	var opt = $.table._option,$form = opt.modalTarget.$("#"+opt.formId);
            	$.form.submit({
            		form:$form,
            		url:url,
            		success: function(result){
            			if (result.state == web_status.SUCCESS) {
            				$.modal.close();
                        	$.table.refresh();
                        } else {
                            $.alert.error(result.msg || "操作失败！");
                        }
            		}
            	});
            },
            // 点击导出按钮
            export: function(){
            	$.alert.confirm("最多只能导出5万条数据，确认导出？",function(){
					var json = $.form.serializeObject() || {};
            		$.operate.wpost($.table._option.exportUrl,json,true);
            	});
            },
            // 批量删除信息
            delete: function() {
        		var rows = $.table.getCheckedValues();
        		if (rows.length == 0) {
        			$.alert.warn("请至少选择一条记录！");
        			return;
        		}
        		$.alert.confirm("确认要删除选中的" + rows.length + "条数据吗？", function() {
        			var url = $.table._option.deleteUrl;
        			var data = { "ids": rows.join() };
        			$.operate.post(url,data,function(result){
        				if (result.state == web_status.SUCCESS) {
        					$.table.refresh();
                        } else {
                            $.alert.error(result.msg || "操作失败！");
                        }
					});
        		});
            }
		},
		// 表单方法	    
		form: {
			submit:function(options){
				// 如果给定了form，则用给予的form；如果给予了formId，则使用指定的formId，否则使用id为ff的form
				var $form = options.form ? options.form : $("#" + (options.formId || "ff"));
				$.alert.loading();
				$form.form({
					url:options.url || $form.attr("action"),
					queryParams:options.queryParams || {},
					// 提交前需要验证
					onSubmit: function(){
						var isValid = $form.form('validate');
						if (!isValid){
							$.alert.closeLoading();
						}
						return isValid;
					},
					success: function(data){
						try{
							$.alert.closeLoading();
							var result = $.parseJSON(data);
							// 调用客户端方法
							if(options.success){
								options.success(result);
							}
						}catch(e){
							$.alert.error("操作失败！");
						}
						
					}
				});
				$form.submit();
			},
			reset: function(form) {
				var $form = ($.type(form) == "object" ? form : $("#" + (form || "sff")));
				$form[0].reset();
			},
			serializeObject:function(form){
				var $form = ($.type(form) == "object" ? form : $("#" + (form || "sff")));
				var json = {};
				$.each($form.serializeArray(), function() {
					var item = this;
					if (json[item["name"]]) {
					    json[item["name"]] = json[item["name"]] + "," + item["value"];
					} else {
					    json[item["name"]] = item["value"];
					}
				});
				return json;    
			},
			// 页面是否处于编辑状态，参数可以是jquery的form对象，或者是一个id
            isEditing:function(input){
            	return $.common.isNotEmpty($.type(input) == "object" ? input.val() : $("#"+(input || "tid")).val());
            }
		},
		// 操作封装处理
		operate: {
			// 提交数据
			submit : function(url, type, dataType, data, callback) {
				var config = {
					url:url,
					type:type,
					dataType:dataType,
					data:data,
					beforeSend:function () {
        	        	$.alert.loading();
        	        },
					success:function(result) {
						$.alert.closeLoading();
						if(callback){
							callback(result);
						}
					}
				};
				$.ajax(config)
			},
			// post请求传输
            post: function(url, data, callback) {
            	$.operate.submit(url, "post", "json", data, callback);
            },
            // get请求传输
            get: function(url, callback) {
            	$.operate.submit(url, "get", "json", "", callback);
            },
            // 发送一个post提交，新打开一个窗口
		    wpost:function(url,params,open){
				var form = $("<form></form>");
				form.attr('action',url).attr('method','post');
				if(open){
					form.attr('target','_blank');
				}
				// 存在params，并且params是一个json
				if(params && jQuery.isPlainObject(params)){
					$.each(params,function(i,n){
						var input = $("<input type='hidden' name='"+i+"' value='"+n+"' />");
						form.append(input);
					});
				}
				form.appendTo("body");
				form.submit();
				form.remove();
			},
			openTab:function(title,dataUrl){
				if (dataUrl == undefined || $.trim(dataUrl).length == 0) return false;
			    var topWindow = $(window.parent.document),flag = true;
			    // 选项卡菜单已存在
			    $('.menuTab', topWindow).each(function() {
			        if ($(this).data('id') == dataUrl) {
			            if (!$(this).hasClass('active')) {
			                $(this).addClass('active').siblings('.menuTab').removeClass('active');
			                $('.page-tabs-content').animate({ marginLeft: ""}, "fast");
			                // 显示tab对应的内容区
			                $('.iframe-main .ey_iframe', topWindow).each(function() {
			                    if ($(this).data('id') == dataUrl) {
			                        $(this).show().siblings('.ey_iframe').hide();
			                        return false;
			                    }
			                });
			            }
			            flag = false;
			            return false;
			        }
			    });
			    // 选项卡菜单不存在
			    if (flag) {
			    	var resId = $.common.random(1,100),
			    	fav_active = $(".nav-list .menuItem[data-id='"+dataUrl+"']").length == 1;
		            var str = '<a href="javascript:;" class="active menuTab" res_id="" data-id="'+dataUrl+'">' + title 
		            	+ '<i class="fa fa-times-circle close-btn" title="关闭"></i>'
		            	+ ' <i class="fa fa-star fav-btn '+(fav_active ? 'fav-btn-active' : '')+'" title="收藏"></i></a>';
		            $('.menuTab', topWindow).removeClass('active');
		            // 添加选项卡对应的iframe
		            var str1 = '<iframe class="ey_iframe" name="iframe'+resId+'" width="100%" height="100%" src="'+dataUrl+'" frameborder="0" data-id="'+dataUrl+'" seamless></iframe>';
		            $('.iframe-main', topWindow).find('iframe.ey_iframe').hide().parents('.iframe-main').append(str1);
			        // 添加选项卡
			        $('.menuTabs .page-tabs-content', topWindow).append(str);
			    }
			    return false;
			}
		},
    	// alert框
    	alert: {
    		// 弹出提示
            msg: function(content, type) {
        	    top.$.messager.alert('系统提示',content,type||"");
            },
    		// 错误提示
            error: function(content) {
            	$.alert.msg(content, modal_status.FAIL);
            },
            // 成功提示
            success: function(content) {
            	$.alert.msg(content, modal_status.INFO);
            },
            // 警告提示
            warn: function(content) {
            	$.alert.msg(content, modal_status.WARNING);
            },
			confirm:function(content,callback){
				top.$.messager.confirm('系统提示', content, function(r){
					if(r){callback()}
				});
			},
			loading:function(content){
				top.$.messager.progress({
	                text: content || '加载中...',
	                interval:120
	            });
			},
			closeLoading:function(){
				top.$.messager.progress('close');
			}
		},
		// 弹出层封装处理
		modal: {
			// 弹出框option和点击确定按钮触发方法
			open: function (options) {
				var $dlg = options.target ? options.target.$('#dlg') : window.$('#dlg');
				var _default_buttons = [{
		            text:'确定',
		            iconCls:'icon-ok',
		            handler:options.onSubmit || function(){}
		        },{
		            text:'关闭',
		            handler:function(){
		            	$.modal.close()
		            }
		        }];
				var buttonsAppend = options.buttonsAppend || "cover";
				if(buttonsAppend == "after" && options.buttons){
					$.each(options.buttons,function(i,v){
						_default_buttons.push(v);
					});
				}else if(buttonsAppend == "before" && options.buttons){
					$.each(options.buttons.reverse(),function(i,v){
						_default_buttons.unshift(v);
					});
				}else {
					_default_buttons = options.buttons || _default_buttons;
				}
				
				// 如果使用iframe方式，则需要看顶层
				$dlg.dialog({
				    title: options.title || "",
				    width: options.width || 800,    
				    height: options.height || ($(options.target ? options.target : window).height() - 100),    
				    href: options.url,
				    onOpen:options.onOpen || function(){},
				    onClose:options.onClose || function(){$dlg.dialog("clear");},
				    onLoad:function(data){///----判断打开dialog是否识别
				    	try{ // 如果能转成json，说明结果有问题了
				    		var result = $.parseJSON(data);
				    		if(result.state != web_status.SUCCESS){
				    			$.alert.error(result.msg || "操作失败！");
				    			$dlg.dialog('close').dialog("clear");
				    		}
						}catch(e){// 如果失败，说明返回的结果正常。
							if(options.onLoad){
								options.onLoad(data);
							}
						}
				    },
				    zIndex:10000,
				    loadingMessage:"加载中...",
				    closed: false,    
				    cache: false,
				    shadow:false, 
				    modal: true,
				    buttons: _default_buttons
				});
				$.modal["current"] = $dlg;
			},
			close:function(){
				var $dlg = $.modal["current"];
				if($dlg){
					$dlg.dialog('close').dialog("clear");
				}
			}
		},
        // 通用方法封装处理
    	common: {
    		// 判断字符串是否为空
            isEmpty: function (val) {
                if (val == null || typeof(val) == "undefined" || (typeof(val) == "string" && val == "" && val != "undefined")){
                    return true;
                }
                return false;
            },
            // 判断一个字符串是否为非空串
            isNotEmpty: function (value) {
            	return !$.common.isEmpty(value);
            },
            // 是否显示数据 为空默认为显示
            visible: function (value) {
                if ($.common.isEmpty(value) || value == true) {
                    return true;
                }
                return false;
            },
            isFunction:function(value){
            	if (value && typeof value != 'undefined' && value instanceof Function){
            		return true;
            	}
            	return false;
            },
            // 空格截取 
            trim: function (value) {
                if (value == null) {
                    return "";
                }
                return value.toString().replace(/(^\s*)|(\s*$)|\r|\n/g, "");
            },
            // 指定随机数返回 返回 min 和 max 之间的随机整数
            random: function (min, max) {
                return Math.floor(Math.random() * (max - min + 1) + min);
            },
            startWith: function(value, start) {
                var reg = new RegExp("^" + start);
                return reg.test(value)
            },
            endWith: function(value, end) {
                var reg = new RegExp(end + "$");
                return reg.test(value)
            },
            // 删除text中指定的c串
			remove:function(text,c){
				if(text==null ||  text.length <=0 ){
					return text;
				}else{
					return text.replace(c,"");
				}
			},
			// 删除text中末尾的c
			removeEnd:function(text,c){
				if(text==null ||  text.length <=0 || text.indexOf(c) < 0){
					return text;
				}else{
					return text.substring(0, text.length - c.length);
				}
			},
			// 删除text中头部的c
			removeStart:function(text,c){
				if(text==null ||  text.length <=0 || text.indexOf(c) < 0){
					return text;
				}else{
					return text.substring(c.length,text.length);
				}
			},
			// 休眠时间，单位微秒
			sleep:function(delay) {
				var start = (new Date()).getTime();
				while ((new Date()).getTime() - start < delay) {
					continue;
				}
			},
            // 将秒转为yyyy-MM-dd hh:mm:ss
            time:function(value,pattern){
				var date = new Date(value * 1000);
				var p = pattern ? pattern : "yyyy-MM-dd hh:mm:ss";
				return date.pattern(p);
			}
        }
    });
    
    // var date = new Date();
	// date.pattern("yyyy-MM-dd hh:mm:ss")
	Date.prototype.pattern=function(fmt) {  
		if(this == 'Invalid Date'){
			return '';
		}
	    var o = {         
		    "M+" : this.getMonth()+1, //月份         
		    "d+" : this.getDate(), //日         
		    "h+" : this.getHours(), //小时         
		    "H+" : this.getHours(), //小时         
		    "m+" : this.getMinutes(), //分         
		    "s+" : this.getSeconds(), //秒         
		    "q+" : Math.floor((this.getMonth()+3)/3), //季度         
		    "S" : this.getMilliseconds() //毫秒         
	    };         
	    var week = {         
		    "0" : "/u65e5",         
		    "1" : "/u4e00",         
		    "2" : "/u4e8c",         
		    "3" : "/u4e09",         
		    "4" : "/u56db",         
		    "5" : "/u4e94",         
		    "6" : "/u516d"        
	    };         
	    if(/(y+)/.test(fmt)){         
	        fmt=fmt.replace(RegExp.$1, (this.getFullYear()+"").substr(4 - RegExp.$1.length));         
	    }         
	    if(/(E+)/.test(fmt)){         
	        fmt=fmt.replace(RegExp.$1, ((RegExp.$1.length>1) ? (RegExp.$1.length>2 ? "/u661f/u671f" : "/u5468") : "")+week[this.getDay()+""]);         
	    }         
	    for(var k in o){         
	        if(new RegExp("("+ k +")").test(fmt)){         
	            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length==1) ? (o[k]) : (("00"+ o[k]).substr((""+ o[k]).length)));         
	        }         
	    }         
	    return fmt;         
	}
})(jQuery);

/** 消息状态码 */
web_status = {
    SUCCESS: 'ok',
    FAIL: 'fail'
};

/** 弹窗状态码 */
modal_status = {
    SUCCESS: "success",
    FAIL: "error",
    INFO: "info",
    WARNING: "warning"
};
